﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Knights.Objeto;

namespace Knights
{
    class Camara
    {
        private static Matrix vista, proyeccion;

        private float velocidadMovimiento = 1f;
        private float velocidadRotacion = 0.002f;

        private Juego juego;
        private Vector3 posicion;
        private Personaje miPersonaje;

        private float deltaRotX, deltaRotY;
        private int posCentralX, posCentralY;

        public Camara(Vector3 posicion, Personaje personaje, Juego juego)
        {
            this.juego = juego;
            this.miPersonaje = personaje;
            this.posicion = new Vector3(posicion.X, posicion.Z, posicion.Y);
            vista = Matrix.CreateLookAt(posicion, Vector3.Zero, Vector3.Up);
            proyeccion = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), Juego.Device.Viewport.AspectRatio, 0.01f, 1000.0f);

            ResetearCursor();
        }

        public void Actualizar()
        {
            KeyboardState teclado = Keyboard.GetState();

            if (teclado.IsKeyDown(Keys.W))
            {
                Mover(Direccion.Atras * velocidadMovimiento);
            }
            if (teclado.IsKeyDown(Keys.S))
            {
                Mover(Direccion.Adelante * velocidadMovimiento);
            }
            if (teclado.IsKeyDown(Keys.D))
            {
                Mover(Direccion.Derecha * velocidadMovimiento);
            }
            if (teclado.IsKeyDown(Keys.A))
            {
                Mover(Direccion.Izquierda * velocidadMovimiento);
            }

            MouseState mouse = Mouse.GetState();

            int deltaX = mouse.X - posCentralX;
            int deltaY = mouse.Y - posCentralY;
            deltaRotY -= velocidadRotacion * deltaX;
            deltaRotX -= velocidadRotacion * deltaY;

            deltaRotX = MathHelper.Clamp(deltaRotX, -1.5f, 1.5f);

            ActualizarMatrices();
            ResetearCursor();
        }

        private void ActualizarMatrices()
        {
            Matrix rotacion = Matrix.CreateRotationX(deltaRotX) * Matrix.CreateRotationY(deltaRotY);

            Vector3 transformado = Vector3.Transform(new Vector3(0, 0, -1), rotacion);
            Vector3 lookAt = posicion + transformado;

            vista = Matrix.CreateLookAt(posicion, lookAt, Vector3.Up);
        }

        private void Mover(Vector3 vector)
        {
            Vector3 frente = Vector3.Transform(vector, Matrix.CreateRotationZ(-deltaRotY));
            posicion.X += frente.X;
            posicion.Y += frente.Z;
            posicion.Z += frente.Y;
        }

        private void ResetearCursor()
        {
            if (juego.IsActive)
            {
                Mouse.SetPosition(juego.TamanioVentana.Width / 2, juego.TamanioVentana.Height / 2);
                posCentralX = juego.TamanioVentana.Width / 2;
                posCentralY = juego.TamanioVentana.Height / 2;
            }
        }

        public static Matrix Vista { get { return vista; } }

        public static Matrix Proyeccion { get { return proyeccion; } }
    }
}
